package com.xuecheng.manage_media_processor.mq;

import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.xuecheng.framework.domain.media.MediaFile;
import com.xuecheng.framework.domain.media.MediaFileProcess_m3u8;
import com.xuecheng.framework.utils.HlsVideoUtil;
import com.xuecheng.framework.utils.Mp4VideoUtil;
import com.xuecheng.manage_media_processor.dao.MediaFileRepository;

/*
 * 监听MQ队列
 */
@Component
public class MediaProcessTask {

    @Autowired
    MediaFileRepository mediaFileRepository;
    
    //ffmpeg执行程序路径
    @Value("${xc-service-manage-media.ffmpeg-path}")
    private String ffmpeg_path;
    
    //存放视频的目录
    @Value("${xc-service-manage-media.video-location}")
    private String video_location;

    // 接收MQ的消息进行视频处理，并且设置配好的容器工厂，支持并发
    @RabbitListener(queues = "${xc-service-manage-media.mq.queue-media-video-processor}",
            containerFactory = "customContainerFactory")
    public void receiveMediaProcessTask(String msg) {
        // 解析消息内容，得到mediaId
        Map map = JSON.parseObject(msg, Map.class);
        String mediaId = (String) map.get("mediaId");
        // 从数据库查询文件信息
        Optional<MediaFile> optional = mediaFileRepository.findById(mediaId);
        if (!optional.isPresent()) {
            // 不存在，直接退出方法
            return;
        }
        MediaFile mediaFile = optional.get();
        // 文件类型
        String fileType = mediaFile.getFileType();
        // 判断是否为avi文件
        if (!fileType.equals("avi")) {//无需处理
            mediaFile.setProcessStatus("303004");
            mediaFileRepository.save(mediaFile);
            return;
        } else {//处理中
            mediaFile.setProcessStatus("303001");
            mediaFileRepository.save(mediaFile);
        }
        //使用工具类生成mp4
        String ffmpeg_location = ffmpeg_path;//ffmpeg执行程序路径
        String avi_location = video_location + mediaFile.getFilePath() 
                           + mediaFile.getFileName();//要转的avi视频路径
        String mp4_name = mediaFile.getFileId() + ".mp4";//生成的mp4文件名
        String mp4_location = video_location + mediaFile.getFilePath();//生成mp4文件所在目录
        Mp4VideoUtil mp4VideoUtil = new Mp4VideoUtil(ffmpeg_location, avi_location, mp4_name, mp4_location);
        String result = mp4VideoUtil.generateMp4();
        if(result==null || !result.equals("success")) {
            //处理失败
            mediaFile.setProcessStatus("303003");
            //记录失败原因
            MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            mediaFileProcess_m3u8.setErrormsg(result);
            mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            //保存
            mediaFileRepository.save(mediaFile);
            return;
        }
        //使用工具类将mp4转成m3u8和分段ts文件
        String mp4_video_path = mp4_location + mp4_name;//mp4文件路径
        String m3u8_name = mediaFile.getFileId() + ".m3u8";//m3u8文件名称
        String m3u8_location = video_location + mediaFile.getFilePath() + "hls/";//生成的m3u8文件所在目录
        HlsVideoUtil hlsVideoUtil = new HlsVideoUtil(ffmpeg_location, mp4_video_path, m3u8_name, m3u8_location);
        String res = hlsVideoUtil.generateM3u8();
        if(res==null || !res.equals("success")) {
            //处理失败
            mediaFile.setProcessStatus("303003");
            //记录失败原因
            MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            mediaFileProcess_m3u8.setErrormsg(res);
            mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            //保存
            mediaFileRepository.save(mediaFile);
            return;
        }
        //处理成功
        //获取ts文件列表
        List<String> tsList = hlsVideoUtil.get_ts_list();
        mediaFile.setProcessStatus("303002");
        MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
        mediaFileProcess_m3u8.setTslist(tsList);
        mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
        //保存fileUrl，关键值，就是视频播放的相对路径
        String fileUrl = mediaFile.getFilePath() + "hls/" + m3u8_name;
        mediaFile.setFileUrl(fileUrl);
        mediaFileRepository.save(mediaFile);//保存
    }

}
